EC2 Image Builder で Rolesディレクトリを使用してる Ansible Playbook を実行するにはどうしたらいいですか?
困っていた内容
EC2 Image Builder で Rolesディレクトリを使用してる Ansible Playbook を実行するにはどうしたらいいですか?
どう対応すればいいの?
EC2 Image Builder + Ansible Playbook については以下ブログが参考になりますのでご参照ください。
Executing Ansible playbooks in your Amazon EC2 Image Builder pipeline
Rolesディレクトリを使用してる場合の方法については以下となります。
S3 bucket に Ansible Playbook をアップロード
以下のような構成の Ansible Playbookを S3にアップロードします。
❯ tree . ├── playbook.yml └── roles ├── apache │ ├── files │ │ ├── httpd.conf │ │ └── ssl.conf │ ├── handlers │ │ └── main.yml │ └── tasks │ └── main.yml ├── mariadb │ ├── files │ │ └── MariaDB.repo │ └── tasks │ └── main.yml ├── php │ └── tasks │ └── main.yml └── yum └── tasks └── main.yml
- playbook.yml
注意、hostsはローカルホスト
- hosts: 127.0.0.1 become: yes roles: - yum - php - apache - mariadb
component.yml
name: 'LAMP on Amazon Linux 2' description: 'LAMP setup' schemaVersion: 1.0 phases: - name: build steps: - name: InstallAnsible action: ExecuteBash inputs: commands: - sudo amazon-linux-extras install -y ansible2 - name: MakeDir action: ExecuteBash inputs: commands: - 'sudo mkdir /tmp/ansible' - name: DownloadPlaybook action: S3Download inputs: - source: 's3://bucket_name/ansible_playbooks/*' destination: '/tmp/ansible' - name: ExecutePlaybook action: ExecuteBash inputs: commands: - 'cd /tmp/ansible' - 'ansible-playbook ./playbook.yml' - name: DeletePlaybook action: ExecuteBash inputs: commands: - rm -rf '{{ build.DownloadPlaybook.inputs[0].destination }}' - name: validate steps: - name: ValidateResponse action: ExecuteBash inputs: commands: - curl -s http://127.0.0.1 - name: test steps: - name: ValidateResponse action: ExecuteBash inputs: commands: - curl -s http://127.0.0.1
Rolesディレクトリを使用していたので、少し変更しています。
- Ansible Playbooksをダウンロードするディレクトリを作成
- name: MakeDir action: ExecuteBash inputs: commands: - 'sudo mkdir /tmp/ansible'
- S3から、Ansible Playbooksをダウンロード
- name: DownloadPlaybook action: S3Download inputs: - source: 's3://bucket_name/ansible_playbooks/*' destination: '/tmp/ansible'
- 移動して、実行
- name: ExecutePlaybook action: ExecuteBash inputs: commands: - 'cd /tmp/ansible' - 'ansible-playbook ./playbook.yml'
これで、EC2 Image Builder で Rolesディレクトリを使用してる Ansible Playbook を実行できました。
IAM Role
権限が足りない可能性があるので、IAM Roleは見直しましょう。
今回は以下のロールのほかにS3をダウンロードするのでAmazonS3ReadOnlyAccess
をアタッチしました。
トラブルシューティング用に、S3にログを出すためにはPutObject
が必要です。
- EC2InstanceProfileForImageBuilder
- AmazonSSMManagedInstanceCore
おまけ
Image pipelinesの設定
トラブルシューティングの為に Terminate instance on failure
はTrue
にするとインスタンスにログインできるので、実際にどこまでコマンドが実行されているか確認することが可能です。
S3に出した、stderr.txt
と、stdout.txt
だとわからない可能性がありますので、お勧めします。